﻿using System;
using System.IO;
using System.Data;
using System.Windows.Forms;

namespace Conversor
{
    class Program
    {
        #region Declarações
        private static OpenFileDialog _myFileDialog;
        private static SaveFileDialog _myFileSaveDialog;
        private static ExcelClass _xls;
        private static DataTable _dtTexto;
        private static DataView _dvTxt;
        #endregion
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        public static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            string xlsPath = Properties.Settings.Default.Excel;
            #region Ficheiro Excel não existe
            if (string.IsNullOrEmpty(xlsPath) || !File.Exists(Properties.Settings.Default.Excel))
            {
                BrowseFile xlsFile = new BrowseFile();
                xlsPath = xlsFile.browse();
            }
            #endregion
            if (xlsPath != null && File.Exists(Properties.Settings.Default.Excel))
            {
                _xls = new ExcelClass();
                _xls.OpenXls(xlsPath);

                _myFileDialog = new OpenFileDialog { Filter = "Ficheiro de Texto (*.txt)|*.txt" };

                if (_myFileDialog.ShowDialog() == DialogResult.OK)
                {
                    if (!string.IsNullOrEmpty(_myFileDialog.FileName))
                    {
                        textFiletoDataTable(_myFileDialog.FileName);

                        _myFileSaveDialog = new SaveFileDialog { Filter = "Ficheiro Texto (*.txt)|*.txt|Ficheiro de Vírgula Flutuante (*.csv)|*.csv" };

                        if (_myFileSaveDialog.ShowDialog() == DialogResult.OK)
                        {
                            dataTableToTextFile(_dvTxt, _myFileSaveDialog.FileName);
                            _xls.CloseXls(xlsPath);
                            MessageBox.Show("Ficheiro de dados convertido com sucesso");
                        }
                        else
                        {
                            MessageBox.Show("Adeus", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            _xls.CloseXls(xlsPath);
                            Application.Exit();
                        }
                    }
                }
                else
                {
                    MessageBox.Show("Adeus", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    _xls.CloseXls(xlsPath);
                    Application.Exit();
                }
            }
        }

        public static void dataTableToTextFile(DataView dvToText, string filePath)
        {
            try
            {
                StreamWriter sw = new StreamWriter(filePath);
                sw.WriteLine("CBLLP07.01" + Environment.NewLine + "GCPLP07.01" + Environment.NewLine + Environment.NewLine +
                    Environment.NewLine);
                foreach (DataRowView row in dvToText)
                {
                    sw.Write("NNNFV");
                    sw.WriteLine(row[0]);
                }
                sw.Close();
            }
            catch (Exception ex)
            { MessageBox.Show(ex.Message); }
        }

        public static void textFiletoDataTable(string filePath)
        {
            try
            {
                _xls.xlsWorkSheet = 2;

                #region InputfromExcel
                int dia = int.Parse(_xls.xlsCelulas("B1"));
                int mes = int.Parse(_xls.xlsCelulas("C1"));
                int ano = int.Parse(_xls.xlsCelulas("D1"));
                int docnum = int.Parse(_xls.xlsCelulas("B3"));
                int[] contribuinte = new int[] { int.Parse(_xls.xlsCelulas("B12")), int.Parse(_xls.xlsCelulas("C12")) };

                int[] contatotal = new int[] { int.Parse(_xls.xlsCelulas("B2")), int.Parse(_xls.xlsCelulas("C2")) };
                int[] isento = new int[] { int.Parse(_xls.xlsCelulas("B4")), int.Parse(_xls.xlsCelulas("C4")) };
                int[] incIva1 = new int[] { int.Parse(_xls.xlsCelulas("B5")), int.Parse(_xls.xlsCelulas("C5")) };
                int[] incIva2 = new int[] { int.Parse(_xls.xlsCelulas("B6")), int.Parse(_xls.xlsCelulas("C6")) };
                int[] incIva3 = new int[] { int.Parse(_xls.xlsCelulas("B7")), int.Parse(_xls.xlsCelulas("C7")) };

                int[] valorIva1 = new int[] { int.Parse(_xls.xlsCelulas("B8")), int.Parse(_xls.xlsCelulas("C8")) };
                int[] valorIva2 = new int[] { int.Parse(_xls.xlsCelulas("B9")), int.Parse(_xls.xlsCelulas("C9")) };
                int[] valorIva3 = new int[] { int.Parse(_xls.xlsCelulas("B10")), int.Parse(_xls.xlsCelulas("C10")) };

                string strcontaisento = _xls.xlsCelulas("D4");
                string strcontainc1 = _xls.xlsCelulas("D5");
                string containc1planoiva = _xls.xlsCelulas("E5");
                string strcontainc2 = _xls.xlsCelulas("D6");
                string containc2planoiva = _xls.xlsCelulas("E6");
                string strcontainc3 = _xls.xlsCelulas("D7");
                string containc3planoiva = _xls.xlsCelulas("E7");
                string strcontaiva1 = _xls.xlsCelulas("D8");
                string strcontaiva2 = _xls.xlsCelulas("D9");
                string strcontaiva3 = _xls.xlsCelulas("D10");

                #endregion

                _dtTexto = new DataTable();
                string[] sr = File.ReadAllLines(_myFileDialog.FileName);
                _dtTexto.Columns.Add();
                _dtTexto.BeginLoadData();

                int nlancamento = 0;
                foreach (string linha in sr)
                {
                    #region Strings
                    string strdia = linha.Substring(dia - 1, 2);
                    string strmes = linha.Substring(mes - 1, 2);
                    string strcontatotal = linha.Substring(contatotal[0] - 1, contatotal[1]).Insert(3, "110");
                    string strano = linha.Substring(ano - 1, 4);
                    string strdocnum = linha.Substring(docnum - 1, 6).Replace(".", "");
                    string strnomecliente = string.Empty.PadRight(12);
                    string strcontribuinte = linha.Substring(contribuinte[0] - 1, contribuinte[1]);
                    #endregion

                    #region Valores
                    decimal vIsento = decimal.Parse(linha.Substring(isento[0] - 1, isento[1]));

                    #region Valores Incidencia
                    decimal vInc1 = decimal.Parse(linha.Substring(incIva1[0] - 1, incIva1[1]).Replace(".", ""));
                    decimal vInc2 = decimal.Parse(linha.Substring(incIva2[0] - 1, incIva2[1]).Replace(".", ""));
                    decimal vInc3 = decimal.Parse(linha.Substring(incIva3[0] - 1, incIva3[1]).Replace(".", ""));
                    decimal tinc = vIsento + vInc1 + vInc2 + vInc3;
                    #endregion

                    #region Valores IVA
                    decimal vIva1 = decimal.Parse(linha.Substring(valorIva1[0] - 1, valorIva1[1]).Replace(".", ""));
                    decimal vIva2 = decimal.Parse(linha.Substring(valorIva2[0] - 1, valorIva2[1]).Replace(".", ""));
                    decimal vIva3 = decimal.Parse(linha.Substring(valorIva3[0] - 1, valorIva3[1]).Replace(".", ""));
                    decimal tvaloriva = vIva1 + vIva2 + vIva3;
                    #endregion

                    #region Total
                    decimal total = vIsento + tinc + tvaloriva;
                    #endregion

                    #endregion

                    nlancamento -= 1;                    
                    string documento = "511 ";
                    string documento2 = "FA ";
                    
                    if (linha.Substring(0, 3) == "CVD")
                    {
                        strcontatotal = "111";
                        strnomecliente = strcontribuinte;                        
                        documento = "561 ";
                        documento2 = "VD ";
                    }

                    #region Primeira Linha Totalizadora
                    if (total != 0)
                        _dtTexto.Rows.Add(strdia + strmes + strcontatotal.PadRight(20) + "50   " +
                               nlancamento.ToString().PadRight(10) + documento + strdocnum.PadLeft(12) + documento2 + "N. " +
                               strdocnum.PadRight(47) + total.ToString("0.00").Replace(',', '.').PadLeft(15) +
                               "D" + strnomecliente.PadRight(12) + "C".PadRight(31) + 1.ToString().PadRight(28) +
                               "0NN".PadRight(19) + linha.Substring(mes - 1, 2).Replace("0", "").PadRight(2) + 0 + strano +
                               "EUR".PadRight(17) + "1.00".PadRight(18) + "1.00".PadRight(18) + "1.000N".PadRight(19) + "0.00");

                    #endregion

                    #region Linhas Isento
                    if (vIsento > 0)
                    {
                        _dtTexto.Rows.Add(strdia + strmes + strcontaisento.PadRight(20) + "50   " +
                           nlancamento.ToString().PadRight(10) + documento + strdocnum.PadLeft(12) + documento2 + "N. " +
                           strdocnum.PadRight(47) + vIsento.ToString("0.00").PadLeft(15).Replace(',', '.') +
                           "C".PadRight(14).PadRight(32) + 1.ToString().PadRight(28) + "0NN".PadRight(19) +
                       linha.Substring(mes - 1, 2).Replace("0", "").PadRight(2) + 0 + strano + "EUR".PadRight(14) + "1.00".PadRight(14) +
                       "1.00".PadRight(14) + "1.000N".PadRight(13) + "0.00");
                    }
                    #endregion

                    #region Linhas Incidencia
                    if (vInc1 > 0)
                    {
                        _dtTexto.Rows.Add(strdia + strmes + strcontainc1.PadRight(20) + "50   " +
                           nlancamento.ToString().PadRight(10) + documento + strdocnum.PadLeft(12) + documento2 + "N. " +
                           strdocnum.PadRight(47) + vInc1.ToString("0.00").PadLeft(15).Replace(',', '.') +
                           "C".PadRight(14) + containc1planoiva.PadRight(30) + 1.ToString().PadRight(28) + "0NN".PadRight(19) +
                       linha.Substring(mes - 1, 2).Replace("0", "").PadRight(2) + 0 + strano + "EUR".PadRight(17) + "1.00".PadRight(18) +
                       "1.00".PadRight(18) + "1.000N".PadRight(19) + "0.00");
                    }

                    if (vInc2 > 0)
                    {
                        _dtTexto.Rows.Add(strdia + strmes + strcontainc2.PadRight(20) + "50   " +
                           nlancamento.ToString().PadRight(10) + documento + strdocnum.PadLeft(12) + documento2 + "N. " +
                           strdocnum.PadRight(47) + vInc2.ToString("0.00").PadLeft(15).Replace(',', '.') +
                           "C".PadRight(14) + containc2planoiva.PadRight(30) + 1.ToString().PadRight(28) + "0NN".PadRight(19) +
                       linha.Substring(mes - 1, 2).Replace("0", "").PadRight(2) + 0 + strano + "EUR".PadRight(17) + "1.00".PadRight(18) +
                       "1.00".PadRight(18) + "1.000N".PadRight(19) + "0.00");
                    }

                    if (vInc3 > 0)
                    {
                        _dtTexto.Rows.Add(strdia + strmes + strcontainc3.PadRight(20) + "50   " +
                           nlancamento.ToString().PadRight(10) + documento + strdocnum.PadLeft(12) + documento2 + "N. " +
                           strdocnum.PadRight(47) + vInc3.ToString("0.00").PadLeft(15).Replace(',', '.') +
                           "C".PadRight(14) + containc3planoiva.PadRight(30) + 1.ToString().PadRight(28) + "0NN".PadRight(19) +
                       linha.Substring(mes - 1, 2).Replace("0", "").PadRight(2) + 0 + strano + "EUR".PadRight(17) + "1.00".PadRight(17) +
                       "1.00".PadRight(18) + "1.000N".PadRight(19) + "0.00");
                    }
                    #endregion

                    #region Linhas Iva
                    if (vIva1 > 0)
                    {
                        _dtTexto.Rows.Add(strdia + strmes + strcontaiva1.PadRight(20) + "50   " +
                           nlancamento.ToString().PadRight(10) + documento + strdocnum.PadLeft(12) + documento2 + "N. " +
                           strdocnum.PadRight(47) + vIva1.ToString("0.00").PadLeft(15).Replace(',', '.') +
                           "C".PadRight(44) + 1.ToString().PadRight(28) + "0NN".PadRight(19) +
                       linha.Substring(mes - 1, 2).Replace("0", "").PadRight(2) + 0 + strano + "EUR".PadRight(17) + "1.00".PadRight(18) +
                       "1.00".PadRight(18) + "1.000N".PadRight(19) + "0.00");
                    }

                    if (vIva2 > 0)
                    {
                        _dtTexto.Rows.Add(strdia + strmes + strcontaiva2.PadRight(20) + "50   " +
                           nlancamento.ToString().PadRight(10) + documento + strdocnum.PadLeft(12) + documento2 + "N. " +
                           strdocnum.PadRight(47) + vIva2.ToString("0.00").PadLeft(15).Replace(',', '.') +
                           "C".PadRight(44) + 1.ToString().PadRight(28) + "0NN".PadRight(19) +
                       linha.Substring(mes - 1, 2).Replace("0", "").PadRight(2) + 0 + strano + "EUR".PadRight(17) + "1.00".PadRight(18) +
                       "1.00".PadRight(18) + "1.000N".PadRight(19) + "0.00");
                    }

                    if (vIva3 > 0)
                    {
                        _dtTexto.Rows.Add(strdia + strmes + strcontaiva3.PadRight(20) + "50   " +
                           nlancamento.ToString().PadRight(10) + documento + strdocnum.PadLeft(12) + documento2 + "N. " +
                           strdocnum.PadRight(44) + vIva3.ToString("0.00").PadLeft(15).Replace(',', '.') +
                           "C".PadRight(44) + 1.ToString().PadRight(28) + "0NN".PadRight(19) +
                       linha.Substring(mes - 1, 2).Replace("0", "").PadRight(2) + 0 + strano + "EUR".PadRight(17) + "1.00".PadRight(14) +
                       "1.00".PadRight(18) + "1.000N".PadRight(19) + "0.00");
                    }
                    #endregion

                }
                _dtTexto.EndLoadData();
                _dvTxt = _dtTexto.DefaultView;
            }
            catch (Exception ex)
            { MessageBox.Show(ex.Message); }
        }
    }
}